#include <iostream>
using namespace std;

// 常函数 ：
// 1. 常函数不能修改成员变量的值
// 2. 常函数不能调用非常函数
//  成员属性声明时加关键字  mutable  后在常函数中依然可以被修改
//  常对象只能调用常函数

//常函数
class Person {
public:
    //成员函数 函数体内部都有 一个 this指针
    //this的本质是 ： 指针常量 指针的指向是不可以被修改的(如 int * const p)
    // const Person * const this
    // 在成员函数后面加 const , 修饰的是this指向 ， 使其指针指向的值也不可以被修改
    void show_Person()  const {
        this -> m_b = 100;
        //this -> m_a = 10; // 常函数不能修改成员变量的值
        //this -> m_a = nullptr; // this指针不可以修改指针的指向
    }
    void fun() {

    }
    Person() {
        this -> m_a = 10;
        this -> m_b = 20;
    }
    int m_a;
    mutable int m_b; //特殊变量 ， 可以在常函数中修改
};

void test01() {
    Person p;
    p.show_Person();
}

//常对象 :
void test02(){
    const Person p;
   // p.m_a = 10;
    p.m_b = 100;

    //常对象只能调用常函数
    p.show_Person();
   // p.fun(); // 常对象不能调用非常函数
}
int main() {
    test01();
    return 0;
}